package TarryDAOS;

import Herramientas.PasarelaDatos;
import Herramientas.ResultSets;
import TarryDTOS.CarteraVencidaDTO;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author alanglez
 */
public class CarteraVencidaDAO {

    private PasarelaDatos db;
    private ResultSets res;

    public CarteraVencidaDAO() {
        db = new PasarelaDatos();
        res = new ResultSets();
    }

    /**
     * ALAN GONZALEZ METODO QUE SELECCIONA EL ESTADO CREDITICIO DE UN PEDIDO
     *
     * @param idPedido
     * @return
     */
    public CarteraVencidaDTO estadoCreditoPedido(int idPedido) {
        CarteraVencidaDTO carteraVencidaDTO = new CarteraVencidaDTO();
        String sql = "SELECT * FROM cartera_crediticia where cartera_crediticia.id_pedido = " + idPedido;
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                carteraVencidaDTO = res.carteraVencidaDTO(rst);
            } else {
                carteraVencidaDTO = null;
            }
        } catch (SQLException ex) {
            Logger.getLogger(CarteraVencidaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return carteraVencidaDTO;
    }

    /**
     * ALAN GONZALEZ METODO PARA SELECCIONAR TODOS LOS CREDITOS EN CURSO
     *
     * @return
     */
    public Vector ventasCreditosActivosEstado() {
        CarteraVencidaDAO carteraVencidaDAO = new CarteraVencidaDAO();
        Vector vPedidosPorVencer = new Vector();
        String sql = "SELECT * FROM cartera_crediticia WHERE cartera_crediticia.bandera_estado = 1";
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            while (rst.next()) {
                CarteraVencidaDTO carteraVencidaDTO = new CarteraVencidaDTO();
                carteraVencidaDTO = res.carteraVencidaDTO(rst);
                vPedidosPorVencer.add(carteraVencidaDTO);
            }
        } catch (SQLException ex) {
            Logger.getLogger(CarteraVencidaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return vPedidosPorVencer;
    }

    /**
     * ALAN GONZALEZ METODO QUE SELECCIONA LOS CREDITOS QUE ESTAN PROXIMOS A
     * VECER
     *
     * @return
     */
    public Vector ventasCreditosVigenciaLimiteEstado() {
        CarteraVencidaDAO carteraVencidaDAO = new CarteraVencidaDAO();
        Vector vPedidosPorVencer = new Vector();
        String sql = "SELECT * FROM cartera_crediticia WHERE cartera_crediticia.bandera_estado = 2";
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            while (rst.next()) {
                CarteraVencidaDTO carteraVencidaDTO = new CarteraVencidaDTO();
                carteraVencidaDTO = res.carteraVencidaDTO(rst);
                vPedidosPorVencer.add(carteraVencidaDTO);
            }
        } catch (SQLException ex) {
            Logger.getLogger(CarteraVencidaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return vPedidosPorVencer;
    }

    /**
     * ALAN GONZALEZ METODO QUE DEVUELVE TODOS LOS CREDITOS VENCIDOS
     *
     * @return
     */
    public Vector ventasCreditosVencidoEstado() {
        CarteraVencidaDAO carteraVencidaDAO = new CarteraVencidaDAO();
        Vector vPedidosPorVencer = new Vector();
        String sql = "SELECT * FROM cartera_crediticia WHERE cartera_crediticia.bandera_estado = 3 order by cartera_crediticia.fecha_vencimiento asc";
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            while (rst.next()) {
                CarteraVencidaDTO carteraVencidaDTO = new CarteraVencidaDTO();
                carteraVencidaDTO = res.carteraVencidaDTO(rst);
                vPedidosPorVencer.add(carteraVencidaDTO);
            }
        } catch (SQLException ex) {
            Logger.getLogger(CarteraVencidaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return vPedidosPorVencer;
    }

    // PROTOCOLOS DE BUSQUEDA -- PROTOCOLOS DE BUSQUEDA -- PROTOCOLOS DE BUSQUEDA -- PROTOCOLOS DE BUSQUEDA -- PROTOCOLOS DE BUSQUEDA
    /**
     * ALAN GONZALEZ - METODO QUE SELECCIONA LOS CREDITOS PROXIMOS A VENCER DE
     * LA FECHA DEL SERVIDOR DEBERA DE ESTAR ENTRE LA FECHA DE INICIO Y LA FECHA
     * DE ALERTA
     *
     * @return
     */
    public Vector ventasCreditoVigente() {
        CarteraVencidaDAO carteraVencidaDAO = new CarteraVencidaDAO();
        Vector vPedidosPorVencer = new Vector();
        String sql = "";
        sql += " SELECT * FROM ";
        sql += " cartera_crediticia ";
        sql += " WHERE";
        sql += " NOW()";
        sql += " BETWEEN";
        sql += " cartera_crediticia.fecha_inicio";
        sql += " AND";
        sql += " cartera_crediticia.fecha_alerta";
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            while (rst.next()) {
                CarteraVencidaDTO carteraVencidaDTO = new CarteraVencidaDTO();
                carteraVencidaDTO = res.carteraVencidaDTO(rst);
                vPedidosPorVencer.add(carteraVencidaDTO);
            }
        } catch (SQLException ex) {
            Logger.getLogger(CarteraVencidaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return vPedidosPorVencer;
    }

    /**
     * ALAN GONZALEZ - METODO QUE SELECCIONA LOS CREDITOS PROXIMOS A VENCER DE
     * LA FECHA DEL SERVIDOR DEBERA DE ESTAR ENTRE LA FECHA DE INICIO Y LA FECHA
     * DE VENCIMIENTO
     *
     * @return
     */
    public Vector ventasCreditoSemanaVencimiento() {
        CarteraVencidaDAO carteraVencidaDAO = new CarteraVencidaDAO();
        Vector vPedidosPorVencer = new Vector();
        String sql = "";
        sql += " SELECT * FROM cartera_crediticia";
        sql += " WHERE";
        sql += " now()";
        sql += " BETWEEN";
        sql += " cartera_crediticia.fecha_alerta ";
        sql += " AND";
        sql += " cartera_crediticia.fecha_vencimiento";
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            while (rst.next()) {
                CarteraVencidaDTO carteraVencidaDTO = new CarteraVencidaDTO();
                carteraVencidaDTO = res.carteraVencidaDTO(rst);
                vPedidosPorVencer.add(carteraVencidaDTO);
            }
        } catch (SQLException ex) {
            Logger.getLogger(CarteraVencidaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return vPedidosPorVencer;
    }

    /**
     * ALAN GONZALEZ - METDO PARA REALIZAR LA BUSQUEDA DE VENTAS DE CREDITO
     * VENCIDO A LA FECHA DEL SERVIDOR O FECHA MENOR A LA DEL SERVIDOR
     *
     * @return
     */
    public Vector ventasCreditoVencido() {
        CarteraVencidaDAO carteraVencidaDAO = new CarteraVencidaDAO();
        Vector vPedidosPorVencer = new Vector();
        String sql = "";
        sql += " SELECT * FROM ";
        sql += " cartera_crediticia ";
        sql += " WHERE";
        sql += " cartera_crediticia.fecha_vencimiento <= NOW()";
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            while (rst.next()) {
                CarteraVencidaDTO carteraVencidaDTO = new CarteraVencidaDTO();
                carteraVencidaDTO = res.carteraVencidaDTO(rst);
                vPedidosPorVencer.add(carteraVencidaDTO);
            }
        } catch (SQLException ex) {
            Logger.getLogger(CarteraVencidaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return vPedidosPorVencer;
    }

    /**
     * ALAN GONZALEZ - METDO PARA REALIZAR LA BUSQUEDA DE VENTAS DE CREDITO c
     * CORTO IGUAL O MENOR A 8 DIAS
     *
     * @return
     */
    public Vector ventasCreditoCorto() {
        CarteraVencidaDAO carteraVencidaDAO = new CarteraVencidaDAO();
        Vector vPedidosPorVencer = new Vector();
        String sql = "";
        sql += " SELECT * FROM cartera_crediticia WHERE";
        sql += " cartera_crediticia.dias_credito < 15 AND";
        sql += " cartera_crediticia.bandera_estado = 0;";
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            while (rst.next()) {
                CarteraVencidaDTO carteraVencidaDTO = new CarteraVencidaDTO();
                carteraVencidaDTO = res.carteraVencidaDTO(rst);
                vPedidosPorVencer.add(carteraVencidaDTO);
            }
        } catch (SQLException ex) {
            Logger.getLogger(CarteraVencidaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return vPedidosPorVencer;
    }

    // FINALIZA PROTOCOLOS DE BUSQUEDA -- FINALIZA PROTOCOLOS DE BUSQUEDA -- FINALIZA PROTOCOLOS DE BUSQUEDA -- FINALIZA PROTOCOLOS DE BUSQUEDA -- FINALIZA PROTOCOLOS DE BUSQUEDA
    /**
     * ALAN GONZALEZ | METODO DE ACTUALIZACION DE FECHAS ESTE METODO SOLO SE
     * EJECUTARA CUANDO EL PEDIDO SE DE POR ENTREGADO DESDE LA INTERFAZ
     */
    public void protocoloActualizacionFechas(int idPedido) {
        int diasCredito = 0;
        db.openDatabase();
        String diasCreditoSQL = "SELECT cartera_crediticia.dias_credito AS dias  FROM cartera_crediticia WHERE cartera_crediticia.id_pedido =" + idPedido;
        ResultSet rst = db.executeQuery(diasCreditoSQL);
        try {
            if (rst.next()) {
                diasCredito = rst.getInt("dias");
            } else {
                diasCredito = 0;
            }
        } catch (SQLException ex) {
            Logger.getLogger(CarteraVencidaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        String sql = "";
        sql += "  UPDATE cartera_crediticia SET ";
        sql += "  cartera_crediticia.fecha_inicio = now()";
        sql += ", cartera_crediticia.bandera_estado = 1";
        sql += ", cartera_crediticia.fecha_vencimiento = ADDDATE(now(),INTERVAL " + diasCredito + " DAY)";
        sql += ", cartera_crediticia.fecha_alerta = SUBDATE(cartera_crediticia.fecha_vencimiento,INTERVAL 1 WEEK)";
        sql += "WHERE";
        sql += "cartera_crediticia.id_pedido = " + idPedido;
        db.openDatabase();
        db.execute(sql);
        db.closeDatabase();
    }

    /**
     * ALAN GONZALEZ ACTUALIZA LOS ESTADOS DE LAS BANDERAS ESTE ES EL PRIMER
     * METODO QUE SE EJECUTA DESPUES SE DISPONEN
     *
     * @return
     */
    public void controladorBanderasCredito(int bandera) {
        /*
         PROTOCOLOS DE ABANDERAMIENTO SQL
         -- 0) CREDITO INICATIVO
         -- 1) CREDITO ACTIVO FECHA ENTRE FECHA DE INICIO Y FECHA DE ALERTA 
         -- 2) CREDITO FECHA DENTRO FECHA DE ALERTA Y DE VENCIMIENTO  
         -- 4) CREDITO VENCIDO FECHA DE VENCIMIENTO MENOR A LA ACTUAL
         */

        /*
         PROTOCOLO DE FUNCIONAMIENTO DE ESTE METODO 
         SE BUSCA SEGUN PROTOCOLO LOS REGISTROS Y SE ACTUALIZAN LAS BANDERAS 
         SEGUN EL PROTOCOLO UTILIZADO PARA SU COINCIDENCIA
         */
        Vector vItems = new Vector();
        Vector vItemsReturn = new Vector();
        String sql = new String();
        switch (bandera) {
// CREDITOS VIGENTES O ACTIVO FECHA ACTUAL ENTRE FECHA DE INICIO Y FECHA DE ALERTA 
            case 1:
                vItems = this.ventasCreditoVigente();
                int aux1 = 0;
                for (aux1 = 0; aux1 < vItems.size(); aux1++) {
                    CarteraVencidaDTO itm = (CarteraVencidaDTO) vItems.elementAt(aux1);
                    sql = null;
                    sql = "update cartera_crediticia SET cartera_crediticia.bandera_estado = 1 where cartera_crediticia.id =" + itm.getId();
                    db.openDatabase();
                    db.execute(sql);
                    db.closeDatabase();
                }
                break;
// CREDITOS DENTRO DE LA SEMANA DE VENCIMIENTO LA FECHA ACTUAL ESTA ENTRE FECHA ALERTA Y FECHA DE VENCIMIENTO
            case 2:
                vItems = this.ventasCreditoSemanaVencimiento();
                int aux3 = 0;
                for (aux3 = 0; aux3 < vItems.size(); aux3++) {
                    CarteraVencidaDTO itm = (CarteraVencidaDTO) vItems.elementAt(aux3);
                    sql = null;
                    sql = "update cartera_crediticia SET cartera_crediticia.bandera_estado = 2 where cartera_crediticia.id =" + itm.getId();
                    //String sql2 = "UPDATE cartera_crediticia SET cartera_crediticia.dias_vencido = (SELECT DATEDIFF(now(), '"+itm.getFechaVencimientoCredito()+"'));";
                    db.openDatabase();
                    db.execute(sql);
                    //db.execute(sql2);
                    //sql2 = null;
                    db.closeDatabase();
                }
                break;
// CREDITOS VENCIDOS LA FECHA ACTUAL ES MAYOR O IGUAL QUE LA FECHA DE VENCIMIENTO
            case 3: // CREDITOS VENCIDOS
                vItems = this.ventasCreditoVencido();
                int aux4 = 0;
                for (aux4 = 0; aux4 < vItems.size(); aux4++) {
                    CarteraVencidaDTO itm = (CarteraVencidaDTO) vItems.elementAt(aux4);
                    sql = null;
                    sql = "update cartera_crediticia SET cartera_crediticia.bandera_estado = 3 where cartera_crediticia.id =" + itm.getId();
                    // ACTUALIZA EL NUMERO DE DIAS VENCIDO
                    String sql2 = "UPDATE cartera_crediticia SET cartera_crediticia.dias_vencido = (SELECT DATEDIFF(now(), '" + itm.getFechaVencimientoCredito() + "')) WHERE cartera_crediticia.id =" + itm.getId();
                    db.openDatabase();
                    db.execute(sql);
                    db.execute(sql2);
                    sql2 = null;
                    db.closeDatabase();
                }
                break;
// CREDITOS ACTIVOS MENORES O 0GUALES A 15 DIAS 
            case 4: // CREDITOS VENCIDOS
                vItems = this.ventasCreditoCorto();
                int aux5 = 0;
                for (aux5 = 0; aux5 < vItems.size(); aux5++) {
                    CarteraVencidaDTO itm = (CarteraVencidaDTO) vItems.elementAt(aux5);
                    sql = null;
                    sql = "update cartera_crediticia SET cartera_crediticia.bandera_estado = 4 where cartera_crediticia.id =" + itm.getId();
                    db.openDatabase();
                    db.execute(sql);
                    db.closeDatabase();
                }
                break;
        }
    }

    /**
     * ALAN GONZALEZ ESTE METODO SE DEBE
     *
     * @param creditoNuevo
     */
    public void pedidoCredito(int idCliente, int idPedido, int nDiasCredito) {
        String sql = "";
        // ESTE QUERY SERA MANIPULADO PARA CONTROLAR LAS FECHAS DE ALERTA SEGUN SERA EL NUMERO DE DIAS DE CREDITO
        sql += " INSERT INTO cartera_crediticia SET ";
        sql += " cartera_crediticia.id_cliente = " + idCliente;
        sql += ", cartera_crediticia.id_pedido =" + idPedido;
        sql += ", cartera_crediticia.dias_credito = " + nDiasCredito;
        // ESTA SOLO LA CAMBIA JAVA CON EL MOTOT DE BUSQUEDA 
        sql += ", cartera_crediticia.bandera_estado = 0";
        sql += ", cartera_crediticia.fecha_emision = NOW()";
        // FECHA EN LA QUE SE INICIA EL PEDIDO STATUS ENTREGADO
        sql += ", cartera_crediticia.fecha_inicio =  null"; //FECHA DE INGRESO NULA POR NO CONOCERSE AL REGISTRPO
        // LA FECHA DE VENCIMIENTO ES LA SUMA DE LOS DIAS DE CREDITO Y LA FECHA DE INICIO 
        //sql += ", cartera_crediticia.fecha_vencimiento = ADDDATE(cartera_crediticia.fecha_inicio, INTERVAL "+nDiasCredito+" DAY)";
        sql += ", cartera_crediticia.fecha_vencimiento = null"; // NULA NO SE CONOCE AL INICIO
        // LA FECHA DE ALERTA ES UNA SEMANA ANTES DEL VENCIMIENTO EN CREDITOS CORTOS DE MENORES A
        // 15 DIAS SERA SOLO DOS DIAS ANTES DE LA FECHA DE VENCIMIENTO
        //sql += ", cartera_crediticia.fecha_alerta  = SUBDATE(cartera_crediticia.fecha_vencimiento,INTERVAL 1 week);";
        sql += ", cartera_crediticia.fecha_alerta  = null";// NULA NO SE CONOCE AL INICIO 
        //sql += ", cartera_crediticia.fecha_alerta  = SUBDATE(cartera_crediticia.fecha_vencimiento,INTERVAL 4 day);";
        //sql += ", cartera_crediticia.fecha_alerta  = null;"; // NULA NO SE CONOCE AL INCIO
        db.openDatabase();
        db.execute(sql);
        db.closeDatabase();
    }

    /**
     * ALAN GONZALEZ METODO PARA CTUALIZAR LAS FECHAS NULAS DEL ESTADO
     * CREDITICIO
     *
     * @param idPedido
     */
    public void iniciaCreditoPedido(int idPedido) { // AQUI ESTA EL BUG NO SE CONCATENO EL ID DEL PEDIDO
        String sql = "";
         sql+=" UPDATE cartera_crediticia SET ";
         sql+=" cartera_crediticia.fecha_inicio = NOW(), ";
         sql+=" cartera_crediticia.fecha_vencimiento = ADDDATE(NOW(), INTERVAL cartera_crediticia.dias_credito DAY),";
         sql+=" cartera_crediticia.fecha_alerta = SUBDATE(cartera_crediticia.fecha_vencimiento, INTERVAL 1 WEEK)";
         sql+=" WHERE";
         sql+=" cartera_crediticia.id_pedido = "+idPedido+";";
        db.openDatabase();
        db.execute(sql);
        db.closeDatabase();
    }

    /**
     * ALAN GONALEZ DEVUELVE TODO REGISTRO DE LA CARTERA CREDITICIA
     *
     * @return
     */
    public Vector todoCredito() {
        Vector vCredito = new Vector();
        String sql = "SELECT * FROM cartera_crediticia;";
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            while (rst.next()) {
                CarteraVencidaDTO c = new CarteraVencidaDTO();
                c = res.carteraVencidaDTO(rst);
                vCredito.add(c);
            }
        } catch (SQLException ex) {
            Logger.getLogger(CarteraVencidaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return vCredito;
    }

    public Vector creditosVencidosPeriodo(String fechaInicio, String fechaFin) {
        CarteraVencidaDAO carteraVencidaDAO = new CarteraVencidaDAO();
        Vector vPedidosPorVencer = new Vector();
        //String sql = "SELECT * FROM cartera_crediticia WHERE cartera_crediticia.bandera_estado = 3 order by cartera_crediticia.fecha_vencimiento asc";
        String sql = new String();
        sql += "";
        sql += " SELECT * FROM ";
        sql += " cartera_crediticia ";
        sql += " WHERE ";
        sql += " cartera_crediticia.bandera_estado = 3 ";
        sql += " AND";
        sql += " cartera_crediticia.fecha_vencimiento ";
        sql += " BETWEEN";
        sql += " '" + fechaInicio + "' ";
        sql += " AND ";
        sql += " '" + fechaFin + "' ";
        sql += "ORDER BY cartera_crediticia.fecha_vencimiento ASC";
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            while (rst.next()) {
                CarteraVencidaDTO carteraVencidaDTO = new CarteraVencidaDTO();
                carteraVencidaDTO = res.carteraVencidaDTO(rst);
                vPedidosPorVencer.add(carteraVencidaDTO);
            }
        } catch (SQLException ex) {
            Logger.getLogger(CarteraVencidaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return vPedidosPorVencer;
    }
}
